package frsf.cidisi.exercise.tpidemia.search;

import Interfaz.NewJFrame;
import frsf.cidisi.exercise.tpidemia.entidades.Cofre;
import frsf.cidisi.exercise.tpidemia.entidades.Pair;
import frsf.cidisi.exercise.tpidemia.entidades.PairDist;
import frsf.cidisi.exercise.tpidemia.entidades.TipoTesoro;
import frsf.cidisi.faia.state.EnvironmentState;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
/**
 * This class represents the real world state.
 */
public class ArqueologoEstadoEntorno extends EnvironmentState {
	  
	private String arqueologoPosicion;
 
    //private ArrayList
    
    public static final String Aragaey = "Aragaey";
    public static final String Ase = "Ase";
    public static final String Bresol = "Bresol";
    public static final String Bulovoe = "Bulovoe";
    public static final String Cabe = "Cabe";
    public static final String Cenede = "Cenede";
    public static final String Ergintone = "Ergintone";
    public static final String Icaedur = "Icaedur";
    public static final String Mixocu = "Mixocu";
    public static final String Peregaey = "Peregaey";
    public static final String Vinizaile = "Vinizaile";
    
    public static TipoTesoro moneda = new TipoTesoro("Moneda",100,0.1);
    public static TipoTesoro rubi = new TipoTesoro("Rubi",50,0.02);
    public static TipoTesoro anillo = new TipoTesoro("Anillo",30,0.045);
    public static TipoTesoro diamante = new TipoTesoro("Diamante",90,0.07);
    public static TipoTesoro colgante = new TipoTesoro("Colgante",15,0.02);
    
    private HashMap<String, Collection<PairDist>> map;
    private HashMap<String, Cofre> tesoro;
    
    public ArqueologoEstadoEntorno() {
        
    	this.arqueologoPosicion = Aragaey; //Setear por interfaz 
        this.posicionPirata= Ase; //Random
        this.map = new HashMap<String, Collection<PairDist>>();
        this.tesoro = new HashMap<String, Cofre>();
         
        this.initState();
    }

    public String getArqueologoPosicion() {
		return arqueologoPosicion;
	}

	public void setArqueologoPosicion(String arqueologoPosicion) {
		this.arqueologoPosicion = arqueologoPosicion;
	}

	public HashMap<String, Collection<PairDist>> getMap() {
		return map;
	}

	public void setMap(HashMap<String, Collection<PairDist>> map) {
		this.map = map;
	}

	public HashMap<String, Cofre> getTesoro() {
		return tesoro;
	}
	
	public Cofre getTesoro(String aldea) {
		Cofre c = new Cofre();
		c = this.tesoro.get(aldea);
		return c;
	}

	public void setTesoro(HashMap<String, Cofre> tesoro) {
		this.tesoro = tesoro;
	}

	/**
     * This method is used to setup the initial real world.
     */
    @Override
    public void initState() {
    	this.setarqueologoPosicion(Aragaey);
    	//Ergintone
    	ArrayList <PairDist> adyacentesErgintone = new ArrayList<PairDist>();
    	PairDist ergintone1 = new PairDist(Bulovoe,200);
    	PairDist ergintone2 = new PairDist(Peregaey,180);
    	PairDist ergintone3 = new PairDist(Aragaey,100);
    	adyacentesErgintone.add(ergintone1);
    	adyacentesErgintone.add(ergintone2);
    	adyacentesErgintone.add(ergintone3);
    	
    	//Bulovoe
    	ArrayList <PairDist> adyacentesBulovoe= new ArrayList<PairDist>();
    	PairDist bulovoe1 = new PairDist(Icaedur,350);
    	PairDist bulovoe2 = new PairDist(Ergintone,200);
    	adyacentesBulovoe.add(bulovoe1);
    	adyacentesBulovoe.add(bulovoe2);
    	
    	//Peregaey
    	ArrayList <PairDist> adyacentesPeregaey = new ArrayList<PairDist>();
    	PairDist paragaey1 = new PairDist(Ergintone,180);
    	PairDist paragaey2 = new PairDist(Vinizaile,450);
    	adyacentesPeregaey.add(paragaey1);
    	adyacentesPeregaey.add(paragaey2);
    	
    	//Aragaey
    	ArrayList <PairDist> adyacentesAragaey= new ArrayList<PairDist>();
    	PairDist aragaey1 = new PairDist(Bresol,150);
    	PairDist aragaey2 = new PairDist(Ergintone,100);
    	adyacentesAragaey.add(aragaey1);
    	adyacentesAragaey.add(aragaey2);
    	
    	
    	//Icaedur
    	ArrayList <PairDist> adyacentesIcaedur = new ArrayList<PairDist>();
    	PairDist icaedur1 = new PairDist(Bulovoe,350);
    	PairDist icaedur2 = new PairDist(Vinizaile,100);
    	adyacentesIcaedur.add(icaedur1);
    	adyacentesIcaedur.add(icaedur2);
    	
    	//Bresol
    	ArrayList <PairDist> adyacentesBresol = new ArrayList<PairDist>();
    	PairDist bresol1 = new PairDist(Aragaey,150);
    	PairDist bresol2 = new PairDist(Vinizaile,400);
    	adyacentesBresol.add(bresol1);
    	adyacentesBresol.add(bresol2);
    	
    	//Vinizaile
    	ArrayList <PairDist> adyacentesVinizaile = new ArrayList<PairDist>();
    	PairDist vinizaile1 = new PairDist(Icaedur,100);
    	PairDist vinizaile2 = new PairDist(Peregaey,450);
    	PairDist vinizaile3 = new PairDist(Bresol,400);
    	PairDist vinizaile4 = new PairDist(Mixocu,300);
    	PairDist vinizaile5 = new PairDist(Cabe,200);
    	adyacentesVinizaile.add(vinizaile1);
    	adyacentesVinizaile.add(vinizaile2);
    	adyacentesVinizaile.add(vinizaile3);
    	adyacentesVinizaile.add(vinizaile4);
    	adyacentesVinizaile.add(vinizaile5);
    	
    	//Mixocu
    	ArrayList <PairDist> adyacentesMixocu = new ArrayList<PairDist>();
    	PairDist mixocu1 = new PairDist(Ase,200);
    	PairDist mixocu2 = new PairDist(Vinizaile,300);
    	adyacentesMixocu.add(mixocu1);
    	adyacentesMixocu.add(mixocu2);
    	
    	//Ase
    	ArrayList <PairDist> adyacentesAse = new ArrayList<PairDist>();
    	PairDist ase1 = new PairDist(Cenede,200);
    	PairDist ase2 = new PairDist(Mixocu,300);
    	adyacentesAse.add(ase1);
    	adyacentesAse.add(ase2);
    	
    	//Cabe
    	ArrayList <PairDist> adyacentesCabe = new ArrayList<PairDist>();
    	PairDist cabe1 = new PairDist(Vinizaile,200);
    	adyacentesCabe.add(cabe1);
    	
    	//Cenede
    	ArrayList <PairDist> adyacentesCenede = new ArrayList<PairDist>();
    	PairDist cenede1 = new PairDist(Ase,200);
    	adyacentesCenede.add(cenede1);
    	
    	//Generamos el Mapa
    	map.put(Ergintone, adyacentesErgintone);
    	map.put(Bulovoe, adyacentesBulovoe);
    	map.put(Peregaey, adyacentesPeregaey);
    	map.put(Aragaey, adyacentesAragaey);
    	map.put(Icaedur, adyacentesIcaedur);
    	map.put(Bresol, adyacentesBresol);
    	map.put(Vinizaile, adyacentesVinizaile);
    	map.put(Mixocu, adyacentesMixocu);
    	map.put(Ase, adyacentesAse);
    	map.put(Cabe, adyacentesCabe);
    	map.put(Cenede,  adyacentesCenede);
    	
    	//Cargar Tesoro
    	//Escenario 1
    	Cofre cErgintone = new Cofre();
    	Pair p1 = new Pair(moneda,300);
    	Pair p2 = new Pair(rubi,400);
    	Pair p3 = new Pair(anillo,280);
    	Pair p4 = new Pair(diamante,80);
    	Pair p5 = new Pair(colgante,150);
    	cErgintone.AgregarTesoro(p1);
    	cErgintone.AgregarTesoro(p2);
    	cErgintone.AgregarTesoro(p3);
    	cErgintone.AgregarTesoro(p4);
    	cErgintone.AgregarTesoro(p5);
    	
    	Cofre cBulovoe = new Cofre();
    	p1 = new Pair(moneda,250);
    	p2 = new Pair(rubi,120);
    	p3 = new Pair(anillo,20);
    	p4 = new Pair(diamante,150);
    	p5 = new Pair(colgante,300);
    	cBulovoe.AgregarTesoro(p1);
    	cBulovoe.AgregarTesoro(p2);
    	cBulovoe.AgregarTesoro(p3);
    	cBulovoe.AgregarTesoro(p4);
    	cBulovoe.AgregarTesoro(p5);
    	
    	Cofre cPeregaey = new Cofre();
    	p1 = new Pair(moneda,100);
    	p2 = new Pair(rubi,400);
    	p3 = new Pair(anillo,500);
    	p4 = new Pair(diamante,450);
    	p5 = new Pair(colgante,500);
    	cPeregaey.AgregarTesoro(p1);
    	cPeregaey.AgregarTesoro(p2);
    	cPeregaey.AgregarTesoro(p3);
    	cPeregaey.AgregarTesoro(p4);
    	cPeregaey.AgregarTesoro(p5);

    	Cofre cAragaey = new Cofre();
    	p1 = new Pair(moneda,100);
    	p2 = new Pair(rubi,20);
    	p3 = new Pair(anillo,80);
    	p4 = new Pair(diamante,300);
    	p5 = new Pair(colgante,550);
    	cAragaey.AgregarTesoro(p1);
    	cAragaey.AgregarTesoro(p2);
    	cAragaey.AgregarTesoro(p3);
    	cAragaey.AgregarTesoro(p4);
    	cAragaey.AgregarTesoro(p5);
    	
    	Cofre cIcaedur = new Cofre();
    	p1 = new Pair(moneda,400);
    	p2 = new Pair(rubi,200);
    	p3 = new Pair(anillo,300);
    	p4 = new Pair(diamante,400);
    	p5 = new Pair(colgante,250);
    	cIcaedur.AgregarTesoro(p1);
    	cIcaedur.AgregarTesoro(p2);
    	cIcaedur.AgregarTesoro(p3);
    	cIcaedur.AgregarTesoro(p4);
    	cIcaedur.AgregarTesoro(p5);
    	
    	Cofre cBresol = new Cofre();
    	p1 = new Pair(moneda,80);
    	p2 = new Pair(rubi,80);
    	p3 = new Pair(anillo,70);
    	p4 = new Pair(diamante,20);
    	p5 = new Pair(colgante,200);
    	cBresol.AgregarTesoro(p1);
    	cBresol.AgregarTesoro(p2);
    	cBresol.AgregarTesoro(p3);
    	cBresol.AgregarTesoro(p4);
    	cBresol.AgregarTesoro(p5);
    	
    	Cofre cVinizaile = new Cofre();
    	p1 = new Pair(moneda,50);
    	p2 = new Pair(rubi,150);
    	p3 = new Pair(anillo,200);
    	p4 = new Pair(diamante,50);
    	p5 = new Pair(colgante,150);
    	cVinizaile.AgregarTesoro(p1);
    	cVinizaile.AgregarTesoro(p2);
    	cVinizaile.AgregarTesoro(p3);
    	cVinizaile.AgregarTesoro(p4);
    	cVinizaile.AgregarTesoro(p5);
    	
    	Cofre cMixocu = new Cofre();
    	p1 = new Pair(moneda,350);
    	p2 = new Pair(rubi,350);
    	p3 = new Pair(anillo,240);
    	p4 = new Pair(diamante,150);
    	p5 = new Pair(colgante,350);
    	cMixocu.AgregarTesoro(p1);
    	cMixocu.AgregarTesoro(p2);
    	cMixocu.AgregarTesoro(p3);
    	cMixocu.AgregarTesoro(p4);
    	cMixocu.AgregarTesoro(p5);
    	
    	Cofre cAse = new Cofre();
    	p1 = new Pair(moneda,20);
    	p2 = new Pair(rubi,50);
    	p3 = new Pair(anillo,70);
    	p4 = new Pair(diamante,100);
    	p5 = new Pair(colgante,60);
    	cAse.AgregarTesoro(p1);
    	cAse.AgregarTesoro(p2);
    	cAse.AgregarTesoro(p3);
    	cAse.AgregarTesoro(p4);
    	cAse.AgregarTesoro(p5);
    	
    	Cofre cCabe = new Cofre();
    	p1 = new Pair(moneda,160);
    	p2 = new Pair(rubi,250);
    	p3 = new Pair(anillo,170);
    	p4 = new Pair(diamante,60);
    	p5 = new Pair(colgante,120);
    	cCabe.AgregarTesoro(p1);
    	cCabe.AgregarTesoro(p2);
    	cCabe.AgregarTesoro(p3);
    	cCabe.AgregarTesoro(p4);
    	cCabe.AgregarTesoro(p5);
    	
    	Cofre cCenede = new Cofre();
    	p1 = new Pair(moneda,160);
    	p2 = new Pair(rubi,250);
    	p3 = new Pair(anillo,170);
    	p4 = new Pair(diamante,60);
    	p5 = new Pair(colgante,120);
    	cCenede.AgregarTesoro(p1);
    	cCenede.AgregarTesoro(p2);
    	cCenede.AgregarTesoro(p3);
    	cCenede.AgregarTesoro(p4);
    	cCenede.AgregarTesoro(p5);

    	//Escenario 2
    	Cofre cErgintone2 = new Cofre();
    	p1 = new Pair(moneda,300);
    	p2 = new Pair(rubi,400);
    	p3 = new Pair(anillo,50);
    	p4 = new Pair(diamante,100);
    	p5 = new Pair(colgante,80);
    	cErgintone.AgregarTesoro(p1);
    	cErgintone.AgregarTesoro(p2);
    	cErgintone.AgregarTesoro(p3);
    	cErgintone.AgregarTesoro(p4);
    	cErgintone.AgregarTesoro(p5);
    	
    	Cofre cBulovoe2 = new Cofre();
    	p1 = new Pair(moneda,150);
    	p2 = new Pair(rubi,350);
    	p3 = new Pair(anillo,100);
    	p4 = new Pair(diamante,100);
    	p5 = new Pair(colgante,250);
    	cBulovoe.AgregarTesoro(p1);
    	cBulovoe.AgregarTesoro(p2);
    	cBulovoe.AgregarTesoro(p3);
    	cBulovoe.AgregarTesoro(p4);
    	cBulovoe.AgregarTesoro(p5);
    	
    	Cofre cPeregaey2 = new Cofre();
    	p1 = new Pair(moneda,200);
    	p2 = new Pair(rubi,150);
    	p3 = new Pair(anillo,200);
    	p4 = new Pair(diamante,300);
    	p5 = new Pair(colgante,400);
    	cPeregaey.AgregarTesoro(p1);
    	cPeregaey.AgregarTesoro(p2);
    	cPeregaey.AgregarTesoro(p3);
    	cPeregaey.AgregarTesoro(p4);
    	cPeregaey.AgregarTesoro(p5);

    	Cofre cAragaey2 = new Cofre();
    	p1 = new Pair(moneda,500);
    	p2 = new Pair(rubi,200);
    	p3 = new Pair(anillo,150);
    	p4 = new Pair(diamante,500);
    	p5 = new Pair(colgante,400);
    	cAragaey.AgregarTesoro(p1);
    	cAragaey.AgregarTesoro(p2);
    	cAragaey.AgregarTesoro(p3);
    	cAragaey.AgregarTesoro(p4);
    	cAragaey.AgregarTesoro(p5);
    	
    	Cofre cIcaedur2 = new Cofre();
    	p1 = new Pair(moneda,50);
    	p2 = new Pair(rubi,150);
    	p3 = new Pair(anillo,300);
    	p4 = new Pair(diamante,80);
    	p5 = new Pair(colgante,150);
    	cIcaedur.AgregarTesoro(p1);
    	cIcaedur.AgregarTesoro(p2);
    	cIcaedur.AgregarTesoro(p3);
    	cIcaedur.AgregarTesoro(p4);
    	cIcaedur.AgregarTesoro(p5);
    	
    	Cofre cBresol2 = new Cofre();
    	p1 = new Pair(moneda,400);
    	p2 = new Pair(rubi,500);
    	p3 = new Pair(anillo,250);
    	p4 = new Pair(diamante,300);
    	p5 = new Pair(colgante,550);
    	cBresol.AgregarTesoro(p1);
    	cBresol.AgregarTesoro(p2);
    	cBresol.AgregarTesoro(p3);
    	cBresol.AgregarTesoro(p4);
    	cBresol.AgregarTesoro(p5);
    	
    	Cofre cVinizaile2 = new Cofre();
    	p1 = new Pair(moneda,500);
    	p2 = new Pair(rubi,200);
    	p3 = new Pair(anillo,150);
    	p4 = new Pair(diamante,300);
    	p5 = new Pair(colgante,250);
    	cVinizaile.AgregarTesoro(p1);
    	cVinizaile.AgregarTesoro(p2);
    	cVinizaile.AgregarTesoro(p3);
    	cVinizaile.AgregarTesoro(p4);
    	cVinizaile.AgregarTesoro(p5);
    	
    	Cofre cMixocu2 = new Cofre();
    	p1 = new Pair(moneda,50);
    	p2 = new Pair(rubi,400);
    	p3 = new Pair(anillo,300);
    	p4 = new Pair(diamante,500);
    	p5 = new Pair(colgante,250);
    	cMixocu.AgregarTesoro(p1);
    	cMixocu.AgregarTesoro(p2);
    	cMixocu.AgregarTesoro(p3);
    	cMixocu.AgregarTesoro(p4);
    	cMixocu.AgregarTesoro(p5);
    	
    	Cofre cAse2 = new Cofre();
    	p1 = new Pair(moneda,300);
    	p2 = new Pair(rubi,400);
    	p3 = new Pair(anillo,500);
    	p4 = new Pair(diamante,200);
    	p5 = new Pair(colgante,150);
    	cAse.AgregarTesoro(p1);
    	cAse.AgregarTesoro(p2);
    	cAse.AgregarTesoro(p3);
    	cAse.AgregarTesoro(p4);
    	cAse.AgregarTesoro(p5);
    	
    	Cofre cCabe2 = new Cofre();
    	p1 = new Pair(moneda,250);
    	p2 = new Pair(rubi,150);
    	p3 = new Pair(anillo,350);
    	p4 = new Pair(diamante,400);
    	p5 = new Pair(colgante,350);
    	cCabe.AgregarTesoro(p1);
    	cCabe.AgregarTesoro(p2);
    	cCabe.AgregarTesoro(p3);
    	cCabe.AgregarTesoro(p4);
    	cCabe.AgregarTesoro(p5);
    	
    	Cofre cCenede2 = new Cofre();
    	p1 = new Pair(moneda,100);
    	p2 = new Pair(rubi,300);
    	p3 = new Pair(anillo,400);
    	p4 = new Pair(diamante,400);
    	p5 = new Pair(colgante,400);
    	cCenede.AgregarTesoro(p1);
    	cCenede.AgregarTesoro(p2);
    	cCenede.AgregarTesoro(p3);
    	cCenede.AgregarTesoro(p4);
    	cCenede.AgregarTesoro(p5);
    	
    	//Para cambiar de escenario solo agergar 2 al nombre de cada coleccion
    	
    	tesoro.put(Ergintone, cErgintone);
    	tesoro.put(Bulovoe, cBulovoe);
    	tesoro.put(Peregaey, cPeregaey);
    	tesoro.put(Aragaey, cAragaey);
    	tesoro.put(Icaedur, cIcaedur);
    	tesoro.put(Bresol, cBresol);
    	tesoro.put(Vinizaile, cVinizaile);
    	tesoro.put(Mixocu, cMixocu);
    	tesoro.put(Ase, cAse);
    	tesoro.put(Cabe, cCabe);
    	tesoro.put(Cenede, cCenede);

    }

    /**
     * String representation of the real world state.
     */

    public String toString() {
        String str = "\n	Emiroce:";
        str+="\n	Posicion Arqueologo: "+this.arqueologoPosicion;
        str+="\n	Posicon Pirata: "+this.posicionPirata;
        
        //str+="\n	Tesoros: "+this.tesoro.toString();
        //falta

        return str;
    }

	//TODO: Complete this section with agent-specific methods
    // The following methods are agent-specific:
	
//     public Other getworld(){
//        return world;
//     }
//     public void setworld(Other arg){
//        world = arg;
//     }
     public String getarqueologoPosicion(){
        return arqueologoPosicion;
     }
     public void setarqueologoPosicion(String arg){
        arqueologoPosicion = arg;
     }
     public String getPosicionPirata() {
 		return posicionPirata;
 	}
     public Cofre getTesoroActual(){
    	 if(this.tesoro.get(arqueologoPosicion) != null){
    		 return this.tesoro.get(arqueologoPosicion).clonarCofre();
    	 }
    	 else{
    		 return null;
    	 }
     }

 	public void setPosicionPirata(String posicionPirata) {
 		this.posicionPirata = posicionPirata;
 	}
 	private String posicionPirata;
 	
 	public void ejecutarPirata(){
 		HashMap<String, Collection<PairDist>> map = this.getMap();
 		ArrayList<String> a= new ArrayList<String>();
 		a.add("Ergintone");
 		a.add("Bulovoe");
 		a.add("Peregaey");
 		a.add("Aragaey");
 		a.add("Icaedur");
 		a.add("Bresol");
 		a.add("Vinizaile");
 		a.add("Mixocu");
 		a.add("Ase");
 		a.add("Cabe");
 		a.add("Cenede");
 		int randomNum =(int)(Math.random()*10); 
 		String nuevaPos = a.get(randomNum);
 		this.setPosicionPirata(nuevaPos);
 		if(!(this.tesoro.containsKey(nuevaPos))){
 		//if(!this.getTesoro().get(nuevaPos).getTesoros().isEmpty()){
 			double random = Math.random();// generamos un numero al azar entre 0 y 1 
 			
 			if(random < 0.4){
 				this.tesoro.remove(posicionPirata);
 				System.out.println("********PIRATA SAQUEA "+nuevaPos+"********");
 			}
 			
 		}
 		
 	}
 	public ArrayList<String> getAdyacentes (String aldea){
		Collection<PairDist> p;
		ArrayList<String> adyac = new ArrayList<String>();
		p = this.getMap().get(aldea);
		for(PairDist a: p)
		{
			adyac.add(a.getAldea());
		}
		
		return adyac;
	}


}

